#pragma once

#include "HXLBMPFILE.h"

void Reverse(HXLBMPFILE &src, HXLBMPFILE &des) // 反白函数
{
	if (src.iYRGBnum == 1) // 如果原图本身是8bit图
	{
		for (int i = 0; i < src.imageh; i++)
			for (int j = 0; j < src.imagew; j++)
			{
				// 反白图
				des.pDataAt(i)[j] = 255 - src.pDataAt(i)[j];
			}
	}

	if (src.iYRGBnum == 3) // 如果原图本身为24bit图
	{
		for (int i = 0; i < src.imageh; i++)
			for (int j = 0; j < src.imagew; j++)
			{
				// 反白图
				des.pDataAt(i, 0)[j] = 255 - src.pDataAt(i, 0)[j];
				des.pDataAt(i, 1)[j] = 255 - src.pDataAt(i, 1)[j];
				des.pDataAt(i, 2)[j] = 255 - src.pDataAt(i, 2)[j];
			}
	}
}

void AdjustPalette(HXLBMPFILE &src, HXLBMPFILE &des) // 调整8位图片调色板的数值
{
	if (src.iYRGBnum == 1)
	{
		for (int i = 0; i < 256; i++)
		{
			des.palette[i].rgbBlue = (i + 50);
			des.palette[i].rgbRed = (2 * i + 80);
			des.palette[i].rgbGreen = (3 * i + 100);
			des.palette[i].rgbReserved = 0;
		}
		for (int i = 0; i < src.imageh; i++)
			for (int j = 0; j < src.imagew; j++)
			{
				// 调整调色板
				des.pDataAt(i)[j] = src.pDataAt(i)[j];
			}
	}
}

void ClrToGray(HXLBMPFILE &src, HXLBMPFILE &des) // 将24位彩图转化为灰度图（位数不变）
{
	if (src.iYRGBnum == 1)
	{
		for (int i = 0; i < 256; i++) // 赋予调色板初值（改为灰度图）
		{
			des.palette[i].rgbBlue = des.palette[i].rgbGreen = des.palette[i].rgbRed = i;
			des.palette[i].rgbReserved = 0;
		}
		for (int i = 0; i < src.imageh; i++)
			for (int j = 0; j < src.imagew; j++)
			{
				// 彩图变灰图
				des.pDataAt(i)[j] = src.pDataAt(i)[j];
			}
	}
	else if (src.iYRGBnum == 3)
	{
		for (int i = 0; i < src.imageh; i++)
			for (int j = 0; j < src.imagew; j++) // 0.299R + 0.587G + 0.114B
			{
				// 彩图变灰图
				des.pDataAt(i, 0)[j] =
					des.pDataAt(i, 1)[j] =
						des.pDataAt(i, 2)[j] = 0.299 * src.pDataAt(i, 0)[j] + 0.587 * src.pDataAt(i, 1)[j] + 0.114 * src.pDataAt(i, 2)[j];
			}
	}
}

bool bmp2txt(const char *cFilename) // 将bmp数据转存入txt，路径为形参
{
	// 将像素数据存入TXT文件。
	HXLBMPFILE bmpfile;
	bmpfile.LoadBMPFILE(cFilename);
	FILE *outfile;
	if ((outfile = fopen("bmp.txt", "w+")) == NULL)
	{
		printf("ERROR\n");
		return false;
	}
	for (int i = 0; i < bmpfile.imageh; i++) // 按行写入
	{
		for (int j = 0; j < bmpfile.imagew; j++)
		{
			fprintf(outfile, "%4d", bmpfile.pDataAt(i)[j]);
		}
		fprintf(outfile, "\n");
	}
	fclose(outfile);
	return true;
}

bool bmp2txt(HXLBMPFILE &bmpfile) // 将bmp数据转存入txt，bmp对象为形参
{
	// 将像素数据存入TXT文件。
	FILE *outfile;
	if ((outfile = fopen("bmp.txt", "w+")) == NULL)
	{
		printf("ERROR\n");
		return false;
	}
	for (int i = 0; i < bmpfile.imageh; i++) // 按行写入
	{
		for (int j = 0; j < bmpfile.imagew; j++)
		{
			fprintf(outfile, "%4d", bmpfile.pDataAt(i)[j]);
		}
		fprintf(outfile, "\n");
	}
	fclose(outfile);
	return true;
}